#region References
using System;

using Server.Engines.CannedEvil;
using Server.Mobiles;
using Server.Targeting;
#endregion

namespace Server.Services.Virtues
{
	public class ValorVirtue
	{
		private static readonly TimeSpan LossDelay = TimeSpan.FromDays(7.0);
		private const int LossAmount = 250;

		public static void Initialize()
		{
			VirtueGump.Register(112, OnVirtueUsed);
		}

		public static void OnVirtueUsed(Mobile from)
		{
			if (from.Alive)
			{
				from.SendLocalizedMessage(1054034); // Target the Champion Idol of the Champion you wish to challenge!.
				from.Target = new InternalTarget();
			}
		}

		public static void CheckAtrophy(Mobile from)
		{
			var pm = from as PlayerMobile;

			if (pm == null)
				return;

			try
			{
				if ((pm.LastValorLoss + LossDelay) < DateTime.UtcNow)
				{
					if (VirtueHelper.Atrophy(from, VirtueName.Valor, LossAmount))
						from.SendLocalizedMessage(1054040); // You have lost some Valor.

					pm.LastValorLoss = DateTime.UtcNow;
				}
			}
			catch
			{ }
		}

		public static void Valor(Mobile from, object targ)
		{
			var idol = targ as IdolOfTheChampion;

			if (idol == null || idol.Deleted || idol.Spawn == null || idol.Spawn.Deleted)
				from.SendLocalizedMessage(1054035); // You must target a Champion Idol to challenge the Champion's spawn!
			else if (from.Hidden)
				from.SendLocalizedMessage(1052015); // You cannot do that while hidden.
			else if (idol.Spawn.HasBeenAdvanced)
				from.SendLocalizedMessage(1054038); // The Champion of this region has already been challenged!
			else
			{
				var vl = VirtueHelper.GetLevel(from, VirtueName.Valor);

				if (idol.Spawn.Active)
				{
					if (idol.Spawn.Champion != null) //TODO: Message?
						return;

					int needed, consumed;

					switch (idol.Spawn.Rank)
					{
						case 0:
						{
							needed = consumed = 2500;
							break;
						}
						case 1:
						{
							needed = consumed = 5000;
							break;
						}
						case 2:
						{
							needed = 10000;
							consumed = 7500;
							break;
						}
						default:
						{
							needed = 20000;
							consumed = 10000;
							break;
						}
					}

					if (from.Virtues.GetValue((int)VirtueName.Valor) >= needed)
					{
						VirtueHelper.Atrophy(from, VirtueName.Valor, consumed);

						from.SendLocalizedMessage(1054037); // Your challenge is heard by the Champion of this region! Beware its wrath!

						idol.Spawn.HasBeenAdvanced = true;
						idol.Spawn.AdvanceLevel();
					}
					else
						from.SendLocalizedMessage(
							1054039); // The Champion of this region ignores your challenge. You must further prove your valor.
				}
				else
				{
					if (vl == VirtueLevel.Knight)
					{
						VirtueHelper.Atrophy(from, VirtueName.Valor, 11000);

						from.SendLocalizedMessage(1054037); // Your challenge is heard by the Champion of this region! Beware its wrath!

						idol.Spawn.EndRestart();
						//idol.Spawn.HasBeenAdvanced = true;
					}
					else
					{
						from.SendLocalizedMessage(
							1054036); // You must be a Knight of Valor to summon the champion's spawn in this manner!
					}
				}
			}
		}

		private class InternalTarget : Target
		{
			public InternalTarget()
				: base(14, false, TargetFlags.None)
			{ }

			protected override void OnTarget(Mobile from, object targeted)
			{
				Valor(from, targeted);
			}
		}
	}
}